﻿using System;
using Sinacor.Infra.UI.Common;

namespace Sinacor.UI.Bovespa.Corretagem.Presenter
{
    public class CadastroFormadorMercado : BasePresenter<ICadastroFormadorMercado>
    { 
        #region Campos
        
		private Communication.Cliente _communicationCliente;
		private Communication.FormadorMercado _communicationFormadorMercado;
		private Communication.Titulo _communicationTitulo;
		private Model.Parameter.FiltroFormadorMercado _filtroFormadorMercado;
		private ModelCollection<Model.FormadorMercado> _listaFormadorMercado;
        private Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada _janelaCadatroFormadorMercado;
        
        #endregion

        #region Construtor

        public CadastroFormadorMercado(ICadastroFormadorMercado viewFormadorMercado)
            : base(viewFormadorMercado)
        {
            ColecaoTipoMercado = new System.Collections.ObjectModel.ObservableCollection<EnumWrapper<Sinacor.UI.Bovespa.Corretagem.Model.Enum.TipoMercado>>();
            _communicationFormadorMercado = new Sinacor.UI.Bovespa.Corretagem.Communication.FormadorMercado(this.Session);
            _communicationTitulo = new Sinacor.UI.Bovespa.Corretagem.Communication.Titulo(this.Session);
            _communicationCliente = new Sinacor.UI.Bovespa.Corretagem.Communication.Cliente(this.Session);

            _filtroFormadorMercado = new Model.Parameter.FiltroFormadorMercado();
            _listaFormadorMercado = new ModelCollection<Sinacor.UI.Bovespa.Corretagem.Model.FormadorMercado>();
        }

        #endregion

        #region Propriedades
        public System.Collections.ObjectModel.ObservableCollection<EnumWrapper<Model.Enum.TipoMercado>> ColecaoTipoMercado { get; set; }
        public ModelCollection<Model.FormadorMercado> ListaFormadorMercado
        {
            get { return _listaFormadorMercado; }
            set {
                _listaFormadorMercado = value;
            }
        }

        public Model.Parameter.FiltroFormadorMercado FiltroFormadorMercado
        {
            get { return _filtroFormadorMercado; }
            set { _filtroFormadorMercado = value; }
        }

        public Sinacor.UI.Bovespa.Clientes.Model.Enum.JanelaChamada JanelaCadatroFormadorMercado
        {
            get { return _janelaCadatroFormadorMercado; }
        }

        #endregion


        #region Metodos
		public bool AlterarFormadorMercado(Model.FormadorMercado parameter){
            try
            {
                if (this.ValidarFormadorMercado(parameter))
                {
                    _communicationFormadorMercado.AlterarFormadorMercado(parameter);
                    return true;
                }

                return false;
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                return false;
            }
		}

		public void ConsultarFormadoresMercados(){

            if (this.ValidarFiltroPesquisa())
            {
                this.ListaFormadorMercado = _communicationFormadorMercado.ConsultarFormadoresMercados(FiltroFormadorMercado);
                if (this.ListaFormadorMercado.Count.Equals(0))
                    View.InformarRegistroNaoEncontrado();
                else
                    View.AtualizarFormadorMercado();
            }
		}

		private bool ConsultarPorApelido(string Apelido){

            if (!string.IsNullOrEmpty(Apelido))
            {
                Model.Parameter.FiltroClientePorApelido parameter = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroClientePorApelido();
                parameter.ApelidoCliente = Apelido;
                Model.Cliente modelCliente = new Sinacor.UI.Bovespa.Corretagem.Model.Cliente();
                modelCliente = _communicationCliente.ConsultarPorApelido(parameter);
                if (modelCliente.Codigo == null)
                {
                    View.InformarClienteNaoCadastrado();
                    return false;
                }
            }
            return true;
		}

        private bool ValidarExistenciaNomeTitulo(Model.Parameter.FiltroNomeTitulo parameter)
        {
            if (!string.IsNullOrEmpty(parameter.Ativo))
            {
                Model.ExistenciaNomeTitulo response = null;
                response = _communicationTitulo.ValidaExistenciaNomeTitulo(parameter);
                if (!response.ExisteNomeTitulo)
                {
                    View.InformarAtivoInvalido();
                    return false;
                }
            }
            return true;
		}

		public bool ExcluirFormadorMercado(Model.FormadorMercado parameter){

            try
            {
                if (parameter == null)
                {
                    View.InformarSelecioneUmRegistro();
                }
                else if (View.ConfirmarExclusaoFormadorMercado())
                {
                    _communicationFormadorMercado.ExcluirFormadorMercado(parameter);
                    
                    View.InformarExclusaoSucesso();

                    return true;
                }

                return false;
            }
            catch (Exception ex)
            {
                base.HandleException(ex);
                return false;
            }            
		}

		public bool IncluirFormadorMercado(Model.FormadorMercado parameter){

            try
            {
                if (string.IsNullOrEmpty(parameter.ApelidoCliente))
                    View.InformarApelidoObrigatorio();
                else if (string.IsNullOrEmpty(parameter.Ativo))
                    View.InformarAtivoObrigatorio();
                else if (!parameter.DataInicial.HasValue)
                    View.InformarDataInicialObrigatoria();
                else if (!parameter.DataFinal.HasValue)
                    View.InformarDataFinalObrigatoria();
                else if (DateTime.Compare(parameter.DataInicial.Value, parameter.DataFinal.Value) == 1)
                    View.InformarDataFinalMenorInicial();
                else if (this.ValidarFormadorMercado(parameter))
                {
                    _communicationFormadorMercado.IncluirFormadorMercado(parameter);
                    return true;
                }

                return false;
            }
            catch (Exception ex)
            {
                this.HandleException(ex);
                return false;
            }
		}

		public bool ValidarApelidoCliente(string ApelidoCliente )
        {
			return this.ConsultarPorApelido(ApelidoCliente);
		}

        public bool ValidarApelidoCliente()
        {
            return this.ConsultarPorApelido(FiltroFormadorMercado.ApelidoCliente);
        }

		public bool ValidarAtivo(string Ativo ){
            Model.Parameter.FiltroNomeTitulo request = new Sinacor.UI.Bovespa.Corretagem.Model.Parameter.FiltroNomeTitulo();
            request.Ativo = Ativo;
            return this.ValidarExistenciaNomeTitulo(request);
		}

		public bool ValidarFormadorMercado(Model.FormadorMercado parameter){

            if (!parameter.PercentualDesconto.HasValue)
                View.InformarPercentualDescontoObrigatorio();
            else if (parameter.PercentualDesconto.Value > 100)
                View.InformarPercentualDescontoInvalido();
            else if (parameter.PercentualDesconto.Value < 0)
                View.InformarPercentualDescontoNegativo();
            else
                return true;

            return false;
		}

        public bool ValidarFiltroPesquisa()
        {
            if (FiltroFormadorMercado.DataInicial.HasValue && FiltroFormadorMercado.DataFinal.HasValue)
            {
                if (DateTime.Compare(FiltroFormadorMercado.DataInicial.Value, FiltroFormadorMercado.DataFinal.Value) == 1)
                {
                    View.InformarDataFinalInvalida();
                    return false;
                }
            }

            if (FiltroFormadorMercado.DataFinal.HasValue && !FiltroFormadorMercado.DataInicial.HasValue)
            {
                View.InformarDataFinalSemInicial();
                return false;
            }

            return true;

        }
        public void CarregarTipoMercado()
        {
            ColecaoTipoMercado = EnumWrapper<Model.Enum.TipoMercado>.GetEnums(Model.Enum.TipoMercado.Vista, Model.Enum.TipoMercado.OpcaoCompra, Model.Enum.TipoMercado.OpcaoVenda);
        }
        #endregion
    }
}
